<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="dqZ91" id="dqZ91"><span data-lake-id="u50e780d1" id="u50e780d1">典型回答</span></h1>
  <p data-lake-id="u82300936" id="u82300936"><br></p>
  <p data-lake-id="u846eb796" id="u846eb796"><span data-lake-id="u41d6a14c" id="u41d6a14c">我们知道，在MySQL中，自增主键有两种，一种是显式的、一种是隐式的。如果我们在一张表中没有定义主键，那么，MySQL会创建一个隐藏的主键（row_id）作为主键。</span></p>
  <p data-lake-id="u175d9bdd" id="u175d9bdd"><br></p>
  <p data-lake-id="uddbec3fd" id="uddbec3fd"><span data-lake-id="u954a9edc" id="u954a9edc">那么，不管是我们自己定义的自增主键，还是row_id的这个主键，都是一个固定类型的，一般都是</span><span data-lake-id="udec09331" id="udec09331">bigint unsigned，那么既然有固定类型，就有取值范围。那么随着数据量的增长，主键的值会不断增长，那么万一超过了这个范围限制，会怎么样呢？</span></p>
  <p data-lake-id="ue846eeb5" id="ue846eeb5"><span data-lake-id="u8c45ec2a" id="u8c45ec2a">​</span><br></p>
  <p data-lake-id="u58f58168" id="u58f58168"><span data-lake-id="u4cb037dc" id="u4cb037dc">如果是我们自己显式定义的一个自增ID，如果已经达到了上限，那么下一次申请ID的时候，得到的值就是那个最大值，后续也不会再增加。这时候我们会拿到一个已经用过的主键，如果继续插入的话，会报主键冲突。</span></p>
  <p data-lake-id="u6b49bc83" id="u6b49bc83"><span data-lake-id="u38c2a192" id="u38c2a192">​</span><br></p>
  <p data-lake-id="u66e0e8de" id="u66e0e8de"><span data-lake-id="udc182ff0" id="udc182ff0">​</span><br></p>
  <p data-lake-id="u3626628f" id="u3626628f"><span data-lake-id="uec19eae4" id="uec19eae4">那如果我们没有自定义自增ID，那么就会默认使用row_id，如果已经达到了上限，那么下一次申请ID的时候，得到的值会从0开始，然后继续重新自增。但是，这种情况如果我们因为没有设置主键，所以他不会报主键冲突，他会直接把这个row_id = 0的数据插入到数据库中，并且会把之前的row_id=0的数据给直接覆盖了。</span></p>
  <p data-lake-id="u13178575" id="u13178575"><span data-lake-id="uf52663a6" id="uf52663a6">​</span><br></p>
  <p data-lake-id="u028ba1c7" id="u028ba1c7"><span data-lake-id="uccdc07f1" id="uccdc07f1">所以，结论是：</span></p>
  <p data-lake-id="ub138b62c" id="ub138b62c"><span data-lake-id="uaf33f5be" id="uaf33f5be">​</span><br></p>
  <p data-lake-id="uacb91e33" id="uacb91e33"><span data-lake-id="uf613fa75" id="uf613fa75">显示自定义的自增ID，用完以后下次插入会报主键冲突。</span></p>
  <p data-lake-id="u00b667a5" id="u00b667a5"><span data-lake-id="u05608b1d" id="u05608b1d">未定义自增ID主键，会用row_id，用完以后下一次插入会覆盖历史数据。</span></p>
  <p data-lake-id="ufe7627fa" id="ufe7627fa"><span data-lake-id="u0fc9a1ae" id="u0fc9a1ae">​</span><br></p>
  <p data-lake-id="u3038a9d5" id="u3038a9d5"><span data-lake-id="u9a78b0f2" id="u9a78b0f2">那么，从这个方面来看的话，我们为了避免数据被覆盖，还是需要自己设置一个自增的主键ID的，毕竟异常我们是可以感知到的，但是数据覆盖我们可能过了很久才能发现。</span></p>
  <p data-lake-id="ueb6173b9" id="ueb6173b9"><span data-lake-id="ua0b0ef78" id="ua0b0ef78">​</span><br></p>
  <p data-lake-id="uc74a61af" id="uc74a61af"><span data-lake-id="u097bcd04" id="u097bcd04">​</span><br></p>
  <p data-lake-id="uc6dce559" id="uc6dce559"><span data-lake-id="uaae95c5a" id="uaae95c5a">​</span><br></p>
  <p data-lake-id="u68dadda7" id="u68dadda7"><br></p>
 </body>
</html>